package com.guaoran.interview.before.jd;

/**
 * @author : guCheng
 * @title : JVM内存模型 
 * @Description : 
 * 	 
 * @date :2018年3月21日上午9:20:53
 */
public class JVM内存模型 {
	
	
	
	/**
	 * 1.JVM内存模型
	 	1.jvm 内存只要包括方法区、堆、栈、pc寄存器、本地方法栈
	 	2.方法区：是线程的共享区域，存放静态变量、常量、类的class信息、方法的信息
	 	3.堆：是线程的共享区域，存放类的实例和new出来的对象：数组，字符串，
	 	4.栈：是线程私有的区域，存放方法中的局部变量，
	 	5.pc寄存器：储存每个线程一下步要执行的JVM指令，如果方法是native，则不做存储，
	 	6.本地方法栈：存放native方法的调用状态
	 	
    2.堆：分新生代（适用于复制算法：edu+s0+s1）和老年代，
 	    2.1算法：引用计数法、复制算法、标记压缩、标记清除，GC的对象是堆空间和永久区
	 	    1.引用计数法：是否可达，java没用
	 	    2.复制算法：针对新生代，缺点是：内存出现严重浪费。存活对象多的时候影响效率。
	 	    3.标记清除：针对老年代：适合存活对象多的场合，不过缺点是：标记和清除过程的效率都不高，会造成大量的碎片，如果碎片过多，会提前触发GC操作。
	 	    4.标记压缩：针对老年代：进行移动存活对象，移动之后清理边界之外的对象。存活对象多的场合效率会高
	 	    5。分代收集算法：存活少的使用复制算法，存活多的使用标记压缩或标记清楚
 	 	2.2 收集器：cms收集器、串行收集器、并行收集器、
 	 		1.串行收集器：最古老最稳定的收集器，效率高，老年代采用标记压缩，新生代采用复制算法。会造成长时间的停顿。
 	 		2.并行收集器：新生代并行（复制算法），老年代串行。只会影响到新生代，是基于多线程的，在多核情况下性能比较好。
 	 		3.cms收集器：并发标记清除。老年代收集器，新生代使用并行收集器， 并发是指跟应用同时执行，停顿时间较少。产生大量空间碎片、并发阶段会降低吞吐量
	 		
	 	
 	 */
	/**
	 * 二、强引用，软引用和弱引用的区别
	 * 	1.强引用:宁愿堆溢出也不回收的
	 * 	2.软引用:如果还有内存空间，就一定不会回收，
	 * 	3.弱引用:发现对象就回收
	 */
	/**
	 * 三、数组在内存中如何分配；
	 * 	int [] arr = new int[4];
	 * 在栈中创建arr数组， new出的数组放到堆中，arr数组去引用放在堆中的数组
	 */
}
